《JavaScript设计模式》——11.5 代理模板

简介: 是的。比如我们将自己的域称为X域,另外的域称为Y域,X域中要有一个被代理页面,即A页面。在A页面中应该具备三个部分,第一个部分是发送请求的模块,如form表单提交,负责向Y域发送请求,并提供额外两组数据,其一是要执行的回调函数名称,其二是X域中代理模板所在的路径,并将target目标指向内嵌框架。

本节书摘来自异步社区《JavaScript设计模式》一书中的第11章,第11.5节,作者:张容铭著,更多章节内容可以访问云栖社区“异步社区”公众号查看

11.5 代理模板

“当然,这种方式还要求其他域要有一定可靠性。否则将会攻击到你的网站。当然这种方式也被人称之为JSONP方案,有时我们还会通过一个方法来动态生成需要的JSONP中的< script >标签”。小铭接着说,“与之类似的还有另外一种方案是被称之为代理模板的方案,他的解决思路是这样的,既然不同域之间相互调用对方的页面是有限制的,那么自己域中的两个页面相互之间的调用是可以的,即代理页面B调用被代理的页面A中对象的方式是可以的。那么要实现这种方式我们只需要在被访问的域中,请求返回的Header重定向到代理页面,并在代理页面中处理被代理的页面A就可以了。”

“既然这样,是不是我们在自己的域中要有这样A、B两个页面了?”小白问。

“是的。比如我们将自己的域称为X域,另外的域称为Y域,X域中要有一个被代理页面,即A页面。在A页面中应该具备三个部分,第一个部分是发送请求的模块,如form表单提交,负责向Y域发送请求,并提供额外两组数据,其一是要执行的回调函数名称,其二是X域中代理模板所在的路径,并将target目标指向内嵌框架。第二个部分是一个内嵌框架,如iframe,负责提供第一个部分中form表单的响应目标target的指向,并将嵌入X域中的代理页面作为子页面,即B页面。第三个部分是一个回调函数,负责处理返回的数据。”

X域中被代理页面A

<script type="text/JavaScript">
function callback(data){
  console.log('成功接收数据', data);
}
</script>
<iframe name="proxyIframe" id="proxyIframe" src="">

</iframe>
<form action="http://localhost/test/proxy.php" method="post" target= "proxyIframe">
  <input type="text" name="callback" value="callback">
  <input type="text" name="proxy" value="http://localhost:8080/proxy.html">
  <input type="submit" value="提交">
</form>

“其次在X域中我们也要有一个代理页面,主要负责将自己页面URL中searcher部分的数据解析出来。将数据重新组装好,调用A页面里的回调函数,将组装好的数据作为参数传入父页面中定义的回调函数中并执行。”

X域中代理页面B

<script type="text/JavaScript">
//页面加载后执行
window.onload = function(){
  //如果不在A页面中返回,不执行
  if(top == self) return;
  //获取并解析searcher中的数据
  var arr = location.search.substr(1).split('&'),
  //预定义函数名称以及参数集
    fn, args;
  for(var i = 0, len = arr.length, item; i < len; i++){
    //解析searcher中的每组数据
    item = arr[i].split('=');
    //判断是否为回调函数
    if(item[0] == 'callback'){
      //设置回调函数
      fn = item[1];
    //判断是否是参数集
    }else if(item[0] == 'arg'){
      //设置参数集
      args = item[1];
    }
  }
  try{
    //执行A页面中预设的回调函数
    eval('top.' + fn + '("' + args + '")');
  }catch(e){}
}
</script>

“最后是Y域中的被请求的接口文件C,它的主要工作是将从X域过来的请求的数据解析并获取回调函数字段与代理模板路径字段数据,并打包返回,并将自己的Header重定向为X域的代理模板B所在路径。”

<?php
  $proxy = $_POST["proxy"];
  $callback = $_POST["callback"];
  header("Location: ".$proxy."?callback=".$callback."&arg=success");
?>
测试结果
/*
  控制台输出依次是
  成功接收数据success
*/
相关文章
|
4天前
|
设计模式 前端开发 JavaScript
【JavaScript 技术专栏】JavaScript 设计模式与实战应用
【4月更文挑战第30天】本文探讨JavaScript设计模式在提升开发效率和代码质量中的关键作用。涵盖单例、工厂、观察者、装饰器和策略模式,并通过实例阐述其在全局状态管理、复杂对象创建、实时数据更新、功能扩展和算法切换的应用。理解并运用这些模式能帮助开发者应对复杂项目,提升前端开发能力。
|
4天前
|
设计模式 算法 C++
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程(二)
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程
30 0
|
4天前
|
API
在vite.config.js 配置代理
在vite.config.js 配置代理
98 2
|
4天前
|
JavaScript 前端开发 定位技术
JavaScript 中如何代理 Set(集合) 和 Map(映射)
JavaScript 中如何代理 Set(集合) 和 Map(映射)
53 0
|
3天前
|
设计模式 存储 前端开发
JS的几种设计模式,Web前端基础三剑客学习知识分享,前端零基础开发
JS的几种设计模式,Web前端基础三剑客学习知识分享,前端零基础开发
|
4天前
|
设计模式 JavaScript 前端开发
js设计模式-观察者模式与发布/订阅模式
观察者模式和发布/订阅模式是JavaScript中的两种设计模式,用于处理对象间的通信和事件处理。观察者模式中,一个主题对象状态改变会通知所有观察者。实现包括定义主题和观察者对象,以及在主题中添加、删除和通知观察者的功能。发布/订阅模式则引入事件管理器,允许发布者发布事件,订阅者通过订阅接收通知。
|
4天前
|
设计模式 JavaScript 算法
js设计模式-策略模式与代理模式的应用
策略模式和代理模式是JavaScript常用设计模式。策略模式通过封装一系列算法,使它们可互换,让算法独立于客户端,提供灵活的选择。例如,定义不同计算策略并用Context类执行。代理模式则为对象提供代理以控制访问,常用于延迟加载或权限控制。如创建RealSubject和Proxy类,Proxy在调用RealSubject方法前可执行额外操作。这两种模式在复杂业务逻辑中发挥重要作用,根据需求选择合适模式解决问题。
|
4天前
|
SQL 缓存 JavaScript
深入解析JavaScript中的模板字符串
深入解析JavaScript中的模板字符串
14 1
|
4天前
|
JavaScript 前端开发 开发者
Vue.js 模板语法
Vue.js 模板语法
|
4天前
|
JSON JavaScript 前端开发
vue2_vite.config.js的proxy跨域配置和nginx配置代理有啥区别?
vue2_vite.config.js的proxy跨域配置和nginx配置代理有啥区别?
34 1